home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume15 / dmake-3.6 / part03 < prev    next >
Encoding:
Text File  |  1990-10-14  |  39.3 KB  |  1,341 lines

  1. Newsgroups: comp.sources.misc
  2. X-UNIX-From: dvadura@watdragon.waterloo.edu
  3. subject: v15i055: dmake version 3.6 (part 03/25)
  4. from: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  5. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  6.  
  7. Posting-number: Volume 15, Issue 55
  8. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  9. Archive-name: dmake-3.6/part03
  10.  
  11. #!/bin/sh
  12. # this is part 3 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file unix/bsd43/uw/startup.mk continued
  15. #
  16. CurArch=3
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file unix/bsd43/uw/startup.mk"
  27. sed 's/^X//' << 'SHAR_EOF' >> unix/bsd43/uw/startup.mk
  28. X   % : s.% ; get $@
  29. X   .NOINFER : s.%
  30. X.END
  31. X
  32. X# Recipe to make archive files.
  33. X%$A :
  34. X[
  35. X   $(AR) $(ARFLAGS) $@ $?
  36. X   $(RM) $(RMFLAGS) $?
  37. X   ranlib $@
  38. X]
  39. X
  40. X# DMAKE uses this recipe to remove intermediate targets
  41. X.REMOVE :; $(RM) -f $<
  42. X
  43. X# AUGMAKE extensions for SYSV compatibility
  44. X@B = $(@:b)
  45. X@D = $(@:d)
  46. X@F = $(@:f)
  47. X*B = $(*:b)
  48. X*D = $(*:d)
  49. X*F = $(*:f)
  50. X<B = $(<:b)
  51. X<D = $(<:d)
  52. X<F = $(<:f)
  53. X?B = $(?:b)
  54. X?F = $(?:f)
  55. X?D = $(?:d)
  56. X
  57. X# Turn warnings back to previous setting.
  58. X.SILENT := $(__.SILENT)
  59. X
  60. X# Local startup file if any
  61. X.INCLUDE .IGNORE: "_startup.mk"
  62. SHAR_EOF
  63. echo "File unix/bsd43/uw/startup.mk is complete"
  64. chmod 0640 unix/bsd43/uw/startup.mk || echo "restore of unix/bsd43/uw/startup.mk fails"
  65. echo "x - extracting unix/bsd43/uw/make.sh (Text)"
  66. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/uw/make.sh &&
  67. Xmkdir objects
  68. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O infer.c
  69. Xmv infer.o objects
  70. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O make.c
  71. Xmv make.o objects
  72. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O stat.c
  73. Xmv stat.o objects
  74. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O expand.c
  75. Xmv expand.o objects
  76. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O string.c
  77. Xmv string.o objects
  78. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O hash.c
  79. Xmv hash.o objects
  80. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O dag.c
  81. Xmv dag.o objects
  82. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O dmake.c
  83. Xmv dmake.o objects
  84. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O path.c
  85. Xmv path.o objects
  86. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O imacs.c
  87. Xmv imacs.o objects
  88. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O sysintf.c
  89. Xmv sysintf.o objects
  90. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O parse.c
  91. Xmv parse.o objects
  92. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O getinp.c
  93. Xmv getinp.o objects
  94. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O quit.c
  95. Xmv quit.o objects
  96. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O basename.c
  97. Xmv basename.o objects
  98. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O dump.c
  99. Xmv dump.o objects
  100. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O macparse.c
  101. Xmv macparse.o objects
  102. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O rulparse.c
  103. Xmv rulparse.o objects
  104. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O percent.c
  105. Xmv percent.o objects
  106. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O function.c
  107. Xmv function.o objects
  108. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/arlib.c
  109. Xmv arlib.o objects
  110. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/dirbrk.c
  111. Xmv dirbrk.o objects
  112. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/explode.c
  113. Xmv explode.o objects
  114. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/rmprq.c
  115. Xmv rmprq.o objects
  116. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/ruletab.c
  117. Xmv ruletab.o objects
  118. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/putenv.c
  119. Xmv putenv.o objects
  120. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/tempnam.c
  121. Xmv tempnam.o objects
  122. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/utime.c
  123. Xmv utime.o objects
  124. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/setvbuf.c
  125. Xmv setvbuf.o objects
  126. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/runargv.c
  127. Xmv runargv.o objects
  128. Xcc  -o dmake  objects/infer.o objects/make.o objects/stat.o objects/expand.o objects/string.o objects/hash.o objects/dag.o objects/dmake.o objects/path.o objects/imacs.o objects/sysintf.o objects/parse.o objects/getinp.o objects/quit.o objects/basename.o objects/dump.o objects/macparse.o objects/rulparse.o objects/percent.o objects/function.o objects/arlib.o objects/dirbrk.o objects/explode.o objects/rmprq.o objects/ruletab.o objects/putenv.o objects/tempnam.o objects/utime.o objects/setvbuf.o objects/runargv.o -luw 
  129. SHAR_EOF
  130. chmod 0640 unix/bsd43/uw/make.sh || echo "restore of unix/bsd43/uw/make.sh fails"
  131. echo "x - extracting unix/bsd43/uw/config.mk (Text)"
  132. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/uw/config.mk &&
  133. X# This is the BSD 4.3 University of Waterloo (uw) UNIX configuration file
  134. X# for DMAKE
  135. X#    It simply modifies the values of LDLIBS to include libuw.a
  136. X#    so that vfprintf can be found.
  137. X#
  138. X
  139. XLDLIBS += -luw
  140. X
  141. X# install script for UW's /usr/software hierarchy...
  142. Xinstall:
  143. X    mkdir ../bin; strip ./dmake; mv ./dmake ../bin
  144. X    chmod a+rx ../bin/dmake ../bin
  145. X    mkdir ../lib; chmod a+rx ../lib
  146. X    cp $(STARTUPFILE) ../lib
  147. X    chmod a+r ../lib/startup.mk
  148. SHAR_EOF
  149. chmod 0640 unix/bsd43/uw/config.mk || echo "restore of unix/bsd43/uw/config.mk fails"
  150. echo "x - extracting unix/bsd43/utime.c (Text)"
  151. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/utime.c &&
  152. X/*
  153. X** change access and modify times of file
  154. X*/
  155. X#include <sys/types.h>
  156. X#include <sys/time.h>
  157. X#include <sys/stat.h>
  158. X#include <sys/file.h>
  159. X
  160. Xint
  161. Xutime(name, timep)
  162. Xchar*    name;
  163. Xtime_t    timep[2];
  164. X{
  165. X    struct timeval tv[2], *tvp;
  166. X    struct stat buf;
  167. X    int    fil;
  168. X    char    data;
  169. X
  170. X    if (timep!=0)
  171. X    {
  172. X        tvp = tv, tv[0].tv_sec = timep[0], tv[1].tv_sec = timep[1];
  173. X        if (utimes(name, tvp)==0)
  174. X            return (0);
  175. X    }
  176. X
  177. X    if (stat(name, &buf) != 0)
  178. X        return (-1);
  179. X    if (buf.st_size != 0)  {
  180. X        if ((fil = open(name, O_RDWR, 0666)) < 0)
  181. X            return (-1);
  182. X        if (read(fil, &data, 1) < 1) {
  183. X            close(fil);
  184. X            return (-1);
  185. X        }
  186. X        lseek(fil, 0L, 0);
  187. X        if (write(fil, &data, 1) < 1) {
  188. X            close(fil);
  189. X            return (-1);
  190. X        }
  191. X        close(fil);
  192. X        return (0);
  193. X    } else     if ((fil = creat(name, 0666)) < 0) {
  194. X        return (-1);
  195. X    } else {
  196. X        close(fil);
  197. X        return (0);
  198. X    }
  199. X}
  200. SHAR_EOF
  201. chmod 0440 unix/bsd43/utime.c || echo "restore of unix/bsd43/utime.c fails"
  202. echo "x - extracting unix/bsd43/tempnam.c (Text)"
  203. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/tempnam.c &&
  204. X/*LINTLIBRARY*/
  205. X#include <stdio.h>
  206. X#include <string.h>
  207. X#include <stdlib.h>
  208. X
  209. X#define max(A,B) (((A)<(B))?(B):(A))
  210. X
  211. Xextern char *mktemp();
  212. Xextern int access();
  213. X
  214. Xstatic char *cpdir();
  215. Xstatic char  *seed="AAA";
  216. X
  217. X/* BSD stdio.h doesn't define P_tmpdir, so let's do it here */
  218. X#ifndef P_tmpdir
  219. Xstatic char *P_tmpdir = "/tmp";
  220. X#endif
  221. X
  222. Xchar *
  223. Xtempnam(dir, prefix)
  224. Xchar *dir;        /* use this directory please (if non-NULL) */
  225. Xchar *prefix;        /* use this (if non-NULL) as filename prefix */
  226. X{
  227. X   register char *p, *q, *tmpdir;
  228. X   int            tl=0, dl=0, pl;
  229. X
  230. X   pl = strlen(P_tmpdir);
  231. X
  232. X   if( (tmpdir = getenv("TMPDIR")) != NULL ) tl = strlen(tmpdir);
  233. X   if( dir != NULL ) dl = strlen(dir);
  234. X
  235. X   if( (p = malloc((unsigned)(max(max(dl,tl),pl)+16))) == NULL )
  236. X     return(NULL);
  237. X
  238. X   *p = '\0';
  239. X
  240. X   if( (tl == 0) || (access( cpdir(p, tmpdir), 3) != 0) )
  241. X     if( (dl == 0) || (access( cpdir(p, dir), 3) != 0) )
  242. X    if( access( cpdir(p, P_tmpdir),   3) != 0 )
  243. X       if( access( cpdir(p, "/tmp"),  3) != 0 )
  244. X          return(NULL);
  245. X
  246. X   (void) strcat(p, "/");
  247. X   if(prefix)
  248. X   {
  249. X      *(p+strlen(p)+5) = '\0';
  250. X      (void)strncat(p, prefix, 5);
  251. X   }
  252. X
  253. X   (void)strcat(p, seed);
  254. X   (void)strcat(p, "XXXXXX");
  255. X
  256. X   q = seed;
  257. X   while(*q == 'Z') *q++ = 'A';
  258. X   ++*q;
  259. X
  260. X   if(*mktemp(p) == '\0') return(NULL);
  261. X   return(p);
  262. X}
  263. X
  264. X
  265. X
  266. Xstatic char *
  267. Xcpdir(buf, str)
  268. Xchar *buf;
  269. Xchar *str;
  270. X{
  271. X   char *p;
  272. X
  273. X   if(str != NULL)
  274. X   {
  275. X      (void) strcpy(buf, str);
  276. X      p = buf - 1 + strlen(buf);
  277. X      if(*p == '/') *p = '\0';
  278. X   }
  279. X
  280. X   return(buf);
  281. X}
  282. SHAR_EOF
  283. chmod 0440 unix/bsd43/tempnam.c || echo "restore of unix/bsd43/tempnam.c fails"
  284. echo "x - extracting unix/bsd43/string.h (Text)"
  285. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/string.h &&
  286. X/*
  287. X** BSD does this wrong
  288. X*/
  289. X#include <strings.h>
  290. X
  291. X#define    strchr(str,c)    index(str,c)
  292. X#define    strrchr(str,c)    rindex(str,c)
  293. X
  294. X#include "stdmacs.h"
  295. Xextern    char*    strpbrk ANSI((char* src, char* any));
  296. X
  297. SHAR_EOF
  298. chmod 0440 unix/bsd43/string.h || echo "restore of unix/bsd43/string.h fails"
  299. echo "x - extracting unix/bsd43/stdlib.h (Text)"
  300. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/stdlib.h &&
  301. X#ifndef _STDLIB_INCLUDED_
  302. X#define _STDLIB_INCLUDED_
  303. X
  304. Xextern /*GOTO*/ _exit();
  305. Xextern /*GOTO*/ exit();
  306. Xextern /*GOTO*/ abort();
  307. Xextern int system();
  308. Xextern char *getenv();
  309. Xextern char *calloc();
  310. Xextern char *malloc();
  311. Xextern char *realloc();
  312. Xextern free();
  313. Xextern int errno;
  314. X
  315. X#ifndef EIO
  316. X#    include <errno.h>
  317. X#endif
  318. X
  319. X#endif /* _STDLIB_INCLUDED_ */
  320. SHAR_EOF
  321. chmod 0440 unix/bsd43/stdlib.h || echo "restore of unix/bsd43/stdlib.h fails"
  322. echo "x - extracting unix/bsd43/stdarg.h (Text)"
  323. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/stdarg.h &&
  324. X/*
  325. X * stdarg.h
  326. X *
  327. X * defines ANSI style macros for accessing arguments of a function which takes
  328. X * a variable number of arguments
  329. X *
  330. X */
  331. X
  332. Xtypedef char *va_list;
  333. X
  334. X#if defined(sparc)
  335. X# define va_alist __builtin_va_alist
  336. X#endif
  337. X# define va_dcl int va_alist
  338. X# define va_start(list,v) list = (char *)&va_alist
  339. X# define va_end(list)     list = NULL
  340. X# define va_arg(list,mode) ((mode *)(list += sizeof(mode)))[-1]
  341. X
  342. SHAR_EOF
  343. chmod 0440 unix/bsd43/stdarg.h || echo "restore of unix/bsd43/stdarg.h fails"
  344. echo "x - extracting unix/bsd43/startup.mk (Text)"
  345. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/startup.mk &&
  346. X# Generic UNIX DMAKE startup file.  Customize to suit your needs.
  347. X# Should work for both SYSV, and BSD 4.3
  348. X# See the documentation for a description of internally defined macros.
  349. X#
  350. X# Disable warnings for macros redefined here that were given
  351. X# on the command line.
  352. X__.SILENT := $(.SILENT)
  353. X.SILENT   := yes
  354. X
  355. X# Configuration parameters for DMAKE startup.mk file
  356. X# Set these to NON-NULL if you wish to turn the parameter on.
  357. X_HAVE_RCS    := yes        # yes => RCS  is installed.
  358. X_HAVE_SCCS    := yes        # yes => SCCS is installed.
  359. X
  360. X# Applicable suffix definitions
  361. XA := .a        # Libraries
  362. XE :=        # Executables
  363. XF := .f        # Fortran
  364. XO := .o        # Objects
  365. XP := .p        # Pascal
  366. XS := .s        # Assembler sources
  367. XV := ,v        # RCS suffix
  368. X
  369. X# Recipe execution configurations
  370. XSHELL        := /bin/sh
  371. XSHELLFLAGS    := -ce
  372. XGROUPSHELL    := $(SHELL)
  373. XGROUPFLAGS    := 
  374. XSHELLMETAS    := |();&<>?*][$$:\\#`'"
  375. XGROUPSUFFIX    :=
  376. XDIVFILE         = $(TMPFILE)
  377. X
  378. X# Standard C-language command names and flags
  379. X   CPP       := /lib/cpp        # C-preprocessor
  380. X   CC      := cc        # C-compiler and flags
  381. X   CFLAGS  +=
  382. X
  383. X   AS      := as        # Assembler and flags
  384. X   ASFLAGS += 
  385. X
  386. X   LD       = $(CC)        # Loader and flags
  387. X   LDFLAGS +=
  388. X   LDLIBS   =
  389. X
  390. X# Definition of $(MAKE) macro for recursive makes.
  391. X   MAKE = $(MAKECMD) $(MFLAGS)
  392. X
  393. X# Definition of Print command for this system.
  394. X   PRINT = lpr
  395. X
  396. X# Language and Parser generation Tools and their flags
  397. X   YACC      := yacc        # standard yacc
  398. X   YFLAGS +=
  399. X   YTAB      := y.tab        # yacc output files name stem.
  400. X
  401. X   LEX      := lex        # standard lex
  402. X   LFLAGS +=
  403. X   LEXYY  := lex.yy        # lex output file
  404. X
  405. X# Other Compilers, Tools and their flags
  406. X   PC    := pc            # pascal compiler
  407. X   RC    := f77            # ratfor compiler
  408. X   FC    := f77            # fortran compiler
  409. X
  410. X   CO       := co        # check out for RCS
  411. X   COFLAGS += -q
  412. X
  413. X   AR     := ar            # archiver
  414. X   ARFLAGS+= ruv
  415. X
  416. X   RM       := /bin/rm        # remove a file command
  417. X   RMFLAGS +=
  418. X
  419. X# Implicit generation rules for making inferences.
  420. X# We don't provide .yr or .ye rules here.  They're obsolete.
  421. X# Rules for making *$O
  422. X   %$O : %.c ; $(CC) $(CFLAGS) -c $<
  423. X   %$O : %$P ; $(PC) $(PFLAGS) -c $<
  424. X   %$O : %$S ; $(AS) $(ASFLAGS) $<
  425. X   %$O : %.cl ; class -c $<
  426. X   %$O : %.e %.r %.F %$F
  427. X    $(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<
  428. X
  429. X# Executables
  430. X   %$E : %$O ; $(LD) $(LDFLAGS) -o $@ $< $(LDLIBES)
  431. X
  432. X# lex and yacc rules
  433. X   %.c : %.y ; $(YACC)  $(YFLAGS) $<; mv $(YTAB).c $@
  434. X   %.c : %.l ; $(LEX)   $(LFLAGS) $<; mv $(LEXYY).c $@
  435. X
  436. X# This rule tells how to make *.out from it's immediate list of prerequisites
  437. X# UNIX only.
  438. X   %.out :; $(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
  439. X
  440. X# RCS support
  441. X.IF $(_HAVE_RCS)
  442. X   % : %$V $$(@:d)RCS/$$(@:f)$V;- $(CO) $(COFLAGS) $@
  443. X   .NOINFER : %$V $$(@:d)RCS/$$(@:f)$V
  444. X.END
  445. X
  446. X# SCCS support
  447. X.IF $(_HAVE_SCCS)
  448. X   % : s.% ; get $@
  449. X   .NOINFER : s.%
  450. X.END
  451. X
  452. X# Recipe to make archive files.
  453. X%$A :
  454. X[
  455. X   $(AR) $(ARFLAGS) $@ $?
  456. X   $(RM) $(RMFLAGS) $?
  457. X   ranlib $@
  458. X]
  459. X
  460. X# DMAKE uses this recipe to remove intermediate targets
  461. X.REMOVE :; $(RM) -f $<
  462. X
  463. X# AUGMAKE extensions for SYSV compatibility
  464. X@B = $(@:b)
  465. X@D = $(@:d)
  466. X@F = $(@:f)
  467. X*B = $(*:b)
  468. X*D = $(*:d)
  469. X*F = $(*:f)
  470. X<B = $(<:b)
  471. X<D = $(<:d)
  472. X<F = $(<:f)
  473. X?B = $(?:b)
  474. X?F = $(?:f)
  475. X?D = $(?:d)
  476. X
  477. X# Turn warnings back to previous setting.
  478. X.SILENT := $(__.SILENT)
  479. X
  480. X# Local startup file if any
  481. X.INCLUDE .IGNORE: "_startup.mk"
  482. SHAR_EOF
  483. chmod 0640 unix/bsd43/startup.mk || echo "restore of unix/bsd43/startup.mk fails"
  484. echo "x - extracting unix/bsd43/setvbuf.c (Text)"
  485. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/setvbuf.c &&
  486. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/unix/bsd43/RCS/setvbuf.c,v 1.1 90/10/06 12:06:11 dvadura Exp $
  487. X-- SYNOPSIS -- setvbuf for BSD
  488. X-- 
  489. X-- DESCRIPTION
  490. X--     A sysv call, standard BSD doesn't have this.
  491. X--
  492. X-- AUTHOR
  493. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  494. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  495. X--
  496. X-- COPYRIGHT
  497. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  498. X-- 
  499. X--      This program is free software; you can redistribute it and/or
  500. X--      modify it under the terms of the GNU General Public License
  501. X--      (version 1), as published by the Free Software Foundation, and
  502. X--      found in the file 'LICENSE' included with this distribution.
  503. X-- 
  504. X--      This program is distributed in the hope that it will be useful,
  505. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  506. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  507. X--      GNU General Public License for more details.
  508. X-- 
  509. X--      You should have received a copy of the GNU General Public License
  510. X--      along with this program;  if not, write to the Free Software
  511. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  512. X--
  513. X-- LOG
  514. X--     $Log:    setvbuf.c,v $
  515. X * Revision 1.1  90/10/06  12:06:11  dvadura
  516. X * dmake Release, Version 3.6
  517. X * 
  518. X*/
  519. X
  520. X#include <stdio.h>
  521. X
  522. Xsetvbuf(fp, bp, type, len_unused)
  523. XFILE*    fp;
  524. Xchar*    bp;
  525. Xint    type;
  526. Xint    len_unused;
  527. X{
  528. X   switch (type) {
  529. X      case _IOLBF: setlinebuf(fp);   return;
  530. X      case _IONBF: setbuf(fp, NULL); return;
  531. X      default:     setbuf(fp, bp);   return;
  532. X   }
  533. X}
  534. X
  535. SHAR_EOF
  536. chmod 0440 unix/bsd43/setvbuf.c || echo "restore of unix/bsd43/setvbuf.c fails"
  537. echo "x - extracting unix/bsd43/runargv.c (Text)"
  538. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/runargv.c &&
  539. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/unix/bsd43/RCS/runargv.c,v 1.1 90/10/06 12:06:09 dvadura Exp $
  540. X-- SYNOPSIS -- invoke a sub process.
  541. X-- 
  542. X-- DESCRIPTION
  543. X--     Use the standard methods of executing a sub process.
  544. X--
  545. X-- AUTHOR
  546. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  547. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  548. X--
  549. X-- COPYRIGHT
  550. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  551. X-- 
  552. X--      This program is free software; you can redistribute it and/or
  553. X--      modify it under the terms of the GNU General Public License
  554. X--      (version 1), as published by the Free Software Foundation, and
  555. X--      found in the file 'LICENSE' included with this distribution.
  556. X-- 
  557. X--      This program is distributed in the hope that it will be useful,
  558. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  559. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  560. X--      GNU General Public License for more details.
  561. X-- 
  562. X--      You should have received a copy of the GNU General Public License
  563. X--      along with this program;  if not, write to the Free Software
  564. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  565. X--
  566. X-- LOG
  567. X--     $Log:    runargv.c,v $
  568. X * Revision 1.1  90/10/06  12:06:09  dvadura
  569. X * dmake Release, Version 3.6
  570. X * 
  571. X*/
  572. X
  573. X#include <signal.h>
  574. X#include "extern.h"
  575. X#include "sysintf.h"
  576. X#include "alloc.h"
  577. X
  578. Xtypedef struct prp {
  579. X   char *prp_cmd;
  580. X   int   prp_group;
  581. X   int   prp_ignore;
  582. X   int   prp_last;
  583. X   int     prp_shell;
  584. X   struct prp *prp_next;
  585. X   char  *prp_dir;
  586. X} RCP, *RCPPTR;
  587. X
  588. Xtypedef struct pr {
  589. X   int        pr_valid;
  590. X   int        pr_pid;
  591. X   CELLPTR    pr_target;
  592. X   HOWPTR    pr_how;
  593. X   int        pr_ignore;
  594. X   int        pr_last;
  595. X   RCPPTR      pr_recipe;
  596. X   RCPPTR      pr_recipe_end;
  597. X} PR;
  598. X
  599. Xstatic PR  *_procs    = NIL(PR);
  600. Xstatic int  _proc_cnt = 0;
  601. Xstatic int  _abort_flg= FALSE;
  602. Xstatic int  _use_i    = -1;
  603. Xstatic int  _do_upd   = 0;
  604. X
  605. Xstatic  void    _add_child ANSI((int, CELLPTR, HOWPTR, int, int));
  606. Xstatic  void    _attach_cmd ANSI((char *, int, int, CELLPTR, HOWPTR, int, int));
  607. Xstatic  void    _finished_child ANSI((int, int));
  608. Xstatic  int     _running ANSI((CELLPTR, HOWPTR));
  609. X
  610. Xint
  611. Xrunargv(target, how, ignore, group, last, shell, cmd)
  612. XCELLPTR target;
  613. XHOWPTR  how;
  614. Xint     ignore;
  615. Xint    group;
  616. Xint    last;
  617. Xint     shell;
  618. Xchar    *cmd;
  619. X{
  620. X   extern  int  errno;
  621. X   extern  char *sys_errlist[];
  622. X   int          pid;
  623. X   char         **argv;
  624. X
  625. X   if( _running(target, how) /*&& Max_proc != 1*/ ) {
  626. X      /* The command will be executed when the previous recipe
  627. X       * line completes. */
  628. X      _attach_cmd( cmd, group, ignore, target, how, last, shell );
  629. X      return(1);
  630. X   }
  631. X
  632. X   while( _proc_cnt == Max_proc )
  633. X      if( Wait_for_child(FALSE, -1) == -1 )  Fatal( "Lost a child" );
  634. X
  635. X   argv = Pack_argv( group, shell, cmd );
  636. X
  637. X   switch( pid=fork() ){
  638. X      int   wid;
  639. X      int   status;
  640. X
  641. X   case -1: /* fork failed */
  642. X      Error("%s: %s", argv[0], sys_errlist[errno]);
  643. X      Handle_result(-1, ignore, _abort_flg, target);
  644. X      return(-1);
  645. X
  646. X   case 0:  /* child */
  647. X      execvp(argv[0], argv);
  648. X      Continue = TRUE;   /* survive error message */
  649. X      Error("%s: %s", argv[0], sys_errlist[errno]);
  650. X      kill(getpid(), SIGTERM);
  651. X      /*NOTREACHED*/
  652. X
  653. X   default: /* parent */
  654. X      _add_child(pid, target, how, ignore, last);
  655. X   }
  656. X
  657. X   return(1);
  658. X}
  659. X
  660. X
  661. Xint
  662. XWait_for_child( abort_flg, pid )
  663. Xint abort_flg;
  664. Xint pid;
  665. X{
  666. X   int wid;
  667. X   int status;
  668. X   int waitchild;
  669. X
  670. X   waitchild = (pid == -1)? FALSE : Wait_for_completion;
  671. X
  672. X   do {
  673. X      if( (wid = wait(&status)) == -1 ) return(-1);
  674. X
  675. X      _abort_flg = abort_flg;
  676. X      _finished_child(wid, status);
  677. X      _abort_flg = FALSE;
  678. X   }
  679. X   while( waitchild && pid != wid );
  680. X
  681. X   return(0);
  682. X}
  683. X
  684. X
  685. Xvoid
  686. XClean_up_processes()
  687. X{
  688. X   register int i;
  689. X
  690. X   if( _procs != NIL(PR) ) {
  691. X      for( i=0; i<Max_proc; i++ )
  692. X     if( _procs[i].pr_valid )
  693. X        kill(_procs[i].pr_pid, SIGTERM);
  694. X
  695. X      while( Wait_for_child(TRUE, -1) != -1 );
  696. X   }
  697. X}
  698. X
  699. X
  700. Xstatic void
  701. X_add_child( pid, target, how, ignore, last )
  702. Xint    pid;
  703. XCELLPTR target;
  704. XHOWPTR  how;
  705. Xint    ignore;
  706. Xint     last;
  707. X{
  708. X   register int i;
  709. X   register PR *pp;
  710. X
  711. X   if( _procs == NIL(PR) ) {
  712. X      TALLOC( _procs, Max_proc, PR );
  713. X   }
  714. X
  715. X   if( (i = _use_i) == -1 )
  716. X      for( i=0; i<Max_proc; i++ )
  717. X     if( !_procs[i].pr_valid )
  718. X        break;
  719. X
  720. X   pp = _procs+i;
  721. X
  722. X   pp->pr_valid  = 1;
  723. X   pp->pr_pid    = pid;
  724. X   pp->pr_target = target;
  725. X   pp->pr_how    = how;
  726. X   pp->pr_ignore = ignore;
  727. X   pp->pr_last   = last;
  728. X
  729. X   Current_target = NIL(HOW);
  730. X
  731. X   _proc_cnt++;
  732. X
  733. X   if( Wait_for_completion ) Wait_for_child( FALSE, pid );
  734. X}
  735. X
  736. X
  737. Xstatic void
  738. X_finished_child(pid, status)
  739. Xint    pid;
  740. Xint    status;
  741. X{
  742. X   register int i;
  743. X   register PR *pp;
  744. X
  745. X   for( i=0; i<Max_proc; i++ )
  746. X      if( _procs[i].pr_valid && _procs[i].pr_pid == pid )
  747. X     break;
  748. X
  749. X   _procs[i].pr_valid = 0;
  750. X   _proc_cnt--;
  751. X
  752. X   if( _procs[i].pr_recipe != NIL(RCP) && !_abort_flg ) {
  753. X      RCPPTR rp = _procs[i].pr_recipe;
  754. X      char   *dir;
  755. X
  756. X      Current_target = _procs[i].pr_how;
  757. X      Handle_result( status, _procs[i].pr_ignore, FALSE, _procs[i].pr_target );
  758. X      Current_target = NIL(HOW);
  759. X
  760. X      _procs[i].pr_recipe = rp->prp_next;
  761. X
  762. X      _use_i = i;
  763. X      dir = _strdup(Get_current_dir());
  764. X      Set_dir( rp->prp_dir );
  765. X      runargv( _procs[i].pr_target, _procs[i].pr_how, rp->prp_ignore,
  766. X                 rp->prp_group, rp->prp_last, rp->prp_shell, rp->prp_cmd );
  767. X      Set_dir(dir);
  768. X      FREE(dir);
  769. X      FREE(rp->prp_dir);
  770. X      _use_i = -1;
  771. X
  772. X      FREE( rp->prp_cmd );
  773. X      FREE( rp );
  774. X
  775. X      if( _proc_cnt == Max_proc ) Wait_for_child( FALSE, -1 );
  776. X   }
  777. X   else {
  778. X      Unlink_temp_files( _procs[i].pr_how );
  779. X      Handle_result(status,_procs[i].pr_ignore,_abort_flg,_procs[i].pr_target);
  780. X
  781. X      if( _procs[i].pr_last && !Doing_bang )
  782. X     Update_time_stamp( _procs[i].pr_target, _procs[i].pr_how );
  783. X   }
  784. X}
  785. X
  786. X
  787. Xstatic int
  788. X_running( cp, how )
  789. XCELLPTR cp;
  790. XHOWPTR  how;
  791. X{
  792. X   register int i;
  793. X
  794. X   if( !_procs ) return(FALSE);
  795. X
  796. X   for( i=0; i<Max_proc; i++ )
  797. X      if( _procs[i].pr_valid &&
  798. X      _procs[i].pr_how == how &&
  799. X      _procs[i].pr_target == cp  )
  800. X     break;
  801. X     
  802. X   return( i != Max_proc );
  803. X}
  804. X
  805. X
  806. Xstatic void
  807. X_attach_cmd( cmd, group, ignore, cp, how, last, shell )
  808. Xchar    *cmd;
  809. Xint    group;
  810. Xint     ignore;
  811. XCELLPTR cp;
  812. XHOWPTR  how;
  813. Xint     last;
  814. Xint     shell;
  815. X{
  816. X   register int i;
  817. X   RCPPTR rp;
  818. X
  819. X   for( i=0; i<Max_proc; i++ )
  820. X      if( _procs[i].pr_valid &&
  821. X      _procs[i].pr_how == how &&
  822. X      _procs[i].pr_target == cp  )
  823. X     break;
  824. X
  825. X   TALLOC( rp, 1, RCP );
  826. X   rp->prp_cmd   = _strdup(cmd);
  827. X   rp->prp_group = group;
  828. X   rp->prp_ignore= ignore;
  829. X   rp->prp_last  = last;
  830. X   rp->prp_shell = shell;
  831. X   rp->prp_dir   = _strdup(Get_current_dir());
  832. X
  833. X   if( _procs[i].pr_recipe == NIL(RCP) )
  834. X      _procs[i].pr_recipe = _procs[i].pr_recipe_end = rp;
  835. X   else {
  836. X      _procs[i].pr_recipe_end->prp_next = rp;
  837. X      _procs[i].pr_recipe_end = rp;
  838. X   }
  839. X}
  840. SHAR_EOF
  841. chmod 0440 unix/bsd43/runargv.c || echo "restore of unix/bsd43/runargv.c fails"
  842. echo "x - extracting unix/bsd43/putenv.c (Text)"
  843. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/putenv.c &&
  844. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/unix/bsd43/RCS/putenv.c,v 1.1 90/10/06 12:06:07 dvadura Exp $
  845. X-- SYNOPSIS -- my own putenv for BSD like systems.
  846. X-- 
  847. X-- DESCRIPTION
  848. X--     This originally came from MKS, but I rewrote it to fix a bug with
  849. X--    replacing existing strings, probably never happened but the code
  850. X--    was wrong nonetheless.
  851. X--
  852. X-- AUTHOR
  853. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  854. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  855. X--
  856. X-- COPYRIGHT
  857. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  858. X-- 
  859. X--      This program is free software; you can redistribute it and/or
  860. X--      modify it under the terms of the GNU General Public License
  861. X--      (version 1), as published by the Free Software Foundation, and
  862. X--      found in the file 'LICENSE' included with this distribution.
  863. X-- 
  864. X--      This program is distributed in the hope that it will be useful,
  865. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  866. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  867. X--      GNU General Public License for more details.
  868. X-- 
  869. X--      You should have received a copy of the GNU General Public License
  870. X--      along with this program;  if not, write to the Free Software
  871. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  872. X--
  873. X-- LOG
  874. X--     $Log:    putenv.c,v $
  875. X * Revision 1.1  90/10/06  12:06:07  dvadura
  876. X * dmake Release, Version 3.6
  877. X * 
  878. X*/
  879. X
  880. X#include <stdio.h>
  881. X#include <string.h>
  882. X
  883. Xint
  884. Xputenv( str )/*
  885. X===============
  886. X   Take a string of the form NAME=value and stick it into the environment.
  887. X   We do this by allocating a new set of pointers if we have to add a new
  888. X   string and by replacing an existing pointer if the value replaces the value
  889. X   of an existing string. */
  890. Xchar *str;
  891. X{
  892. X   extern char **environ;        /* The current environment. */
  893. X   static char **ourenv = NULL;        /* A new environment        */
  894. X   register char **p;
  895. X   register char *q;
  896. X   int      size;
  897. X
  898. X   /* First search the current environment and see if we can replace a
  899. X    * string. */
  900. X   for( p=environ; *p; p++ ) {
  901. X      register char *s = str;
  902. X
  903. X      for( q = *p; *q && *s && *s == *q; q++, s++ )
  904. X     if( *s == '=' ) {
  905. X        *p = str;
  906. X        return(0);            /* replaced it so go away */
  907. X     }
  908. X   }
  909. X
  910. X   /* Ok, can't replace a string so need to grow the environment. */
  911. X   size = p - environ + 2;    /* size of new environment */
  912. X                /* size of old is size-1   */
  913. X
  914. X   /* It's the first time, so allocate a new environment since we don't know
  915. X    * where the old one is comming from. */
  916. X   if( ourenv == NULL ) {
  917. X      if( (ourenv = (char **) malloc( sizeof(char *)*size )) == NULL )
  918. X     return(1);
  919. X
  920. X      memcpy( (char *)ourenv, (char *)environ, (size-2)*sizeof(char *) );
  921. X   }
  922. X   else if( (ourenv = (char **)realloc( ourenv, size*sizeof(char *))) == NULL )
  923. X      return(1);
  924. X
  925. X   ourenv[--size] = NULL;
  926. X   ourenv[--size] = str;
  927. X
  928. X   environ = ourenv;
  929. X   return(0);
  930. X}
  931. SHAR_EOF
  932. chmod 0440 unix/bsd43/putenv.c || echo "restore of unix/bsd43/putenv.c fails"
  933. echo "x - extracting unix/bsd43/make.sh (Text)"
  934. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/make.sh &&
  935. Xmkdir objects
  936. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O infer.c
  937. Xmv infer.o objects
  938. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O make.c
  939. Xmv make.o objects
  940. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O stat.c
  941. Xmv stat.o objects
  942. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O expand.c
  943. Xmv expand.o objects
  944. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O string.c
  945. Xmv string.o objects
  946. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O hash.c
  947. Xmv hash.o objects
  948. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O dag.c
  949. Xmv dag.o objects
  950. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O dmake.c
  951. Xmv dmake.o objects
  952. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O path.c
  953. Xmv path.o objects
  954. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O imacs.c
  955. Xmv imacs.o objects
  956. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O sysintf.c
  957. Xmv sysintf.o objects
  958. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O parse.c
  959. Xmv parse.o objects
  960. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O getinp.c
  961. Xmv getinp.o objects
  962. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O quit.c
  963. Xmv quit.o objects
  964. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O basename.c
  965. Xmv basename.o objects
  966. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O dump.c
  967. Xmv dump.o objects
  968. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O macparse.c
  969. Xmv macparse.o objects
  970. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O rulparse.c
  971. Xmv rulparse.o objects
  972. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O percent.c
  973. Xmv percent.o objects
  974. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O function.c
  975. Xmv function.o objects
  976. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/arlib.c
  977. Xmv arlib.o objects
  978. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/dirbrk.c
  979. Xmv dirbrk.o objects
  980. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/explode.c
  981. Xmv explode.o objects
  982. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/rmprq.c
  983. Xmv rmprq.o objects
  984. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/ruletab.c
  985. Xmv ruletab.o objects
  986. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/putenv.c
  987. Xmv putenv.o objects
  988. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/tempnam.c
  989. Xmv tempnam.o objects
  990. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/utime.c
  991. Xmv utime.o objects
  992. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/setvbuf.c
  993. Xmv setvbuf.o objects
  994. Xcc -c -DHELP -I. -Icommon -Iunix -Iunix/bsd43 -O unix/bsd43/runargv.c
  995. Xmv runargv.o objects
  996. Xcc  -o dmake  objects/infer.o objects/make.o objects/stat.o objects/expand.o objects/string.o objects/hash.o objects/dag.o objects/dmake.o objects/path.o objects/imacs.o objects/sysintf.o objects/parse.o objects/getinp.o objects/quit.o objects/basename.o objects/dump.o objects/macparse.o objects/rulparse.o objects/percent.o objects/function.o objects/arlib.o objects/dirbrk.o objects/explode.o objects/rmprq.o objects/ruletab.o objects/putenv.o objects/tempnam.o objects/utime.o objects/setvbuf.o objects/runargv.o 
  997. SHAR_EOF
  998. chmod 0640 unix/bsd43/make.sh || echo "restore of unix/bsd43/make.sh fails"
  999. echo "x - extracting unix/bsd43/config.mk (Text)"
  1000. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/config.mk &&
  1001. X# This is the BSD 4.3 UNIX configuration file for DMAKE
  1002. X#    It simply modifies the values of SRC, and checks to see if
  1003. X#    OSENVIRONMENT is defined.  If so it includes the appropriate
  1004. X#    config.mk file.
  1005. X#
  1006. X# It also sets the values of .SOURCE.c and .SOURCE.h to include the local
  1007. X# directory.
  1008. X#
  1009. Xosrdir := $(OS)$(DIRSEPSTR)$(OSRELEASE)
  1010. X
  1011. X# The following sources are required for BSD4.3
  1012. XOSDSRC := putenv.c tempnam.c utime.c setvbuf.c runargv.c
  1013. XSRC    += $(OSDSRC)
  1014. X.SETDIR=$(osrdir) : $(OSDSRC)
  1015. X
  1016. X.SOURCE.h : $(osrdir)
  1017. X
  1018. X# Local configuration modifications for CFLAGS, there's local BSD includes
  1019. X# too.
  1020. XCFLAGS += -I$(osrdir)
  1021. X
  1022. X# See if we modify anything in the lower levels.
  1023. X.IF $(OSENVIRONMENT) != $(NULL)
  1024. X   .INCLUDE .IGNORE : $(osrdir)$(DIRSEPSTR)$(OSENVIRONMENT)$(DIRSEPSTR)config.mk
  1025. X.END
  1026. SHAR_EOF
  1027. chmod 0640 unix/bsd43/config.mk || echo "restore of unix/bsd43/config.mk fails"
  1028. echo "x - extracting unix/bsd43/config.h (Text)"
  1029. sed 's/^X//' << 'SHAR_EOF' > unix/bsd43/config.h &&
  1030. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/unix/bsd43/RCS/config.h,v 1.1 90/10/06 12:06:05 dvadura Exp $
  1031. X-- SYNOPSIS -- Configurarion include file.
  1032. X-- 
  1033. X-- DESCRIPTION
  1034. X--     There is one of these for each specific machine configuration.
  1035. X--    It can be used to further tweek the machine specific sources
  1036. X--    so that they compile.
  1037. X--
  1038. X-- AUTHOR
  1039. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  1040. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  1041. X--
  1042. X-- COPYRIGHT
  1043. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  1044. X-- 
  1045. X--      This program is free software; you can redistribute it and/or
  1046. X--      modify it under the terms of the GNU General Public License
  1047. X--      (version 1), as published by the Free Software Foundation, and
  1048. X--      found in the file 'LICENSE' included with this distribution.
  1049. X-- 
  1050. X--      This program is distributed in the hope that it will be useful,
  1051. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  1052. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1053. X--      GNU General Public License for more details.
  1054. X-- 
  1055. X--      You should have received a copy of the GNU General Public License
  1056. X--      along with this program;  if not, write to the Free Software
  1057. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1058. X--
  1059. X-- LOG
  1060. X--     $Log:    config.h,v $
  1061. X * Revision 1.1  90/10/06  12:06:05  dvadura
  1062. X * dmake Release, Version 3.6
  1063. X * 
  1064. X*/
  1065. X
  1066. X/* define this for configurations that don't have the coreleft function
  1067. X * so that the code compiles.  To my knowledge coreleft exists only on
  1068. X * Turbo C, but it is needed here since the function is used in many debug
  1069. X * macros. */
  1070. X#define coreleft() 0L
  1071. X
  1072. X/* Define the getcwd function that is used in the code, since BSD does
  1073. X * not have getcwd, but call it getwd instead. */
  1074. Xextern    char*    getwd ANSI((char*));
  1075. X#define    getcwd(buf,siz)    getwd(buf)
  1076. SHAR_EOF
  1077. chmod 0440 unix/bsd43/config.h || echo "restore of unix/bsd43/config.h fails"
  1078. echo "x - extracting unix/arlib.c (Text)"
  1079. sed 's/^X//' << 'SHAR_EOF' > unix/arlib.c &&
  1080. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/unix/RCS/arlib.c,v 1.1 90/10/06 12:06:53 dvadura Exp $
  1081. X-- SYNOPSIS -- Unix archive manipulation code.
  1082. X-- 
  1083. X-- DESCRIPTION
  1084. X--     Originally this code was provided by Eric Gisin of MKS.  I took
  1085. X--    his code and completely rewrote it adding cacheing of lib members
  1086. X--    and other various optimizations.  I kept the overal functional
  1087. X--    idea of the library routines as they are similar to those in GNU
  1088. X--    make and felt it advantageous to maintain a similar interface.
  1089. X--
  1090. X-- AUTHOR
  1091. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  1092. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  1093. X--
  1094. X-- COPYRIGHT
  1095. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  1096. X-- 
  1097. X--      This program is free software; you can redistribute it and/or
  1098. X--      modify it under the terms of the GNU General Public License
  1099. X--      (version 1), as published by the Free Software Foundation, and
  1100. X--      found in the file 'LICENSE' included with this distribution.
  1101. X-- 
  1102. X--      This program is distributed in the hope that it will be useful,
  1103. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  1104. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1105. X--      GNU General Public License for more details.
  1106. X-- 
  1107. X--      You should have received a copy of the GNU General Public License
  1108. X--      along with this program;  if not, write to the Free Software
  1109. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1110. X--
  1111. X-- LOG
  1112. X--     $Log:    arlib.c,v $
  1113. X * Revision 1.1  90/10/06  12:06:53  dvadura
  1114. X * dmake Release, Version 3.6
  1115. X * 
  1116. X*/
  1117. X
  1118. X#include "extern.h"
  1119. X#include "sysintf.h"
  1120. X#include <ar.h>
  1121. X#include <stdio.h>
  1122. X
  1123. X/* By defining the defines below it is possible to configure the library
  1124. X * code for library cacheing/non-cacheing, ASCII archive headers, and a full
  1125. X * decode of the ar_hdr fields in the scan_ar function. */
  1126. X
  1127. X#define ASCARCH            1    /* ASCII time stored in archive    */
  1128. X#define LC            1    /* Turn on library cacheing    */
  1129. X#define DECODE_ALL_AR_FIELDS    0    /* decode only fields make needs*/
  1130. X
  1131. X#if LC
  1132. X#  define FOUND_MEMBER    FALSE
  1133. X#else
  1134. X#  define FOUND_MEMBER    TRUE
  1135. X#  define _cache_member(a, b, c)
  1136. X#  define _check_cache(a, b, c, d)    FALSE
  1137. X#endif
  1138. X
  1139. X#define    MAXFNAME    32    /* Longest file name in archive    */
  1140. X#define    MAXMNAME    8    /* Max module name < MAXFNAME    */
  1141. X
  1142. X
  1143. X/* This struct is used to pass the library and member information about the
  1144. X * routines that perform the library seeking/cacheing */
  1145. Xstruct ar_args {
  1146. X   char   *lib;
  1147. X   char   *member;
  1148. X   time_t time;
  1149. X};
  1150. X
  1151. X
  1152. Xtypedef struct AR {
  1153. X   char    ar_name[MAXFNAME+1];      /* File name */
  1154. X   long    ar_size;                  /* Size in bytes */
  1155. X   time_t  ar_time;                  /* Modification time */
  1156. X
  1157. X#ifdef DOS
  1158. X   char    ar_modname[MAXMNAME+1];   /* DOS module name */
  1159. X#endif
  1160. X
  1161. X#if DECODE_ALL_AR_FIELDS
  1162. X   uint16  ar_mode;                  /* File mode */
  1163. X   uint16  ar_uid;                     /* File owner */
  1164. X   uint16  ar_gid;                   /* File group owner */
  1165. X#endif
  1166. X} AR, *ARPTR;
  1167. X
  1168. X
  1169. Xstatic int ar_scan  ANSI((FILE *,
  1170. X              int (*) ANSI((FILE *, struct AR *, struct ar_args *)),
  1171. X              struct ar_args *));
  1172. Xstatic int ar_touch ANSI(( FILE *, time_t ));
  1173. Xstatic int time_function  ANSI(( FILE *, struct AR *, struct ar_args * ));
  1174. Xstatic int touch_function ANSI(( FILE *, struct AR *, struct ar_args * ));
  1175. X
  1176. X#if LC
  1177. Xstatic int _cache_member ANSI((char *, char *, time_t));
  1178. Xstatic int _check_cache  ANSI((char *, char *, time_t *, int));
  1179. X#endif
  1180. X
  1181. X/* decoded archive header */
  1182. Xstatic AR _ar;
  1183. X
  1184. X
  1185. Xtime_t
  1186. Xseek_arch(name, lib)/*
  1187. X======================
  1188. X   Look for module 'name' inside 'lib'.  If compiled with cacheing then first
  1189. X   check to see if the specified lib is cached.  If so then return that time
  1190. X   stamp instead of looking into the library. */
  1191. Xchar    *name;
  1192. Xchar     *lib;
  1193. X{
  1194. X   FILE   *f;
  1195. X   int    rv;
  1196. X   time_t mtime;
  1197. X   struct ar_args args;
  1198. X
  1199. X   /* Check the cache first (if there is a cache) */
  1200. X   if( _check_cache(name, lib, &mtime, FALSE) )  return( mtime );
  1201. X
  1202. X   /* Open the lib file and perform the scan of the members, looking
  1203. X    * for our particular member.  If cacheing is enabled it will be
  1204. X    * taken care of automatically during the scan. */
  1205. X
  1206. X   args.lib    = lib;
  1207. X   args.member = name;
  1208. X   args.time   = (time_t)0L;
  1209. X
  1210. X   if( (f = fopen(lib, "r")) == NIL(FILE) ) return( (time_t)0L );
  1211. X   rv = ar_scan(f, time_function, &args );
  1212. X   fclose( f );
  1213. X
  1214. X   if( rv < 0 ) Fatal("(%s): Invalid library format", lib);
  1215. X
  1216. X   return( args.time );
  1217. X}
  1218. X
  1219. X
  1220. Xint
  1221. Xtouch_arch(name, lib)/*
  1222. X=======================
  1223. X   Look for module 'name' inside 'lib'.  If compiled with cacheing then first
  1224. X   check to see if the specified lib is cached.  If so then set that time
  1225. X   stamp and write it into the library.  Returns 0 on success, non-zero
  1226. X   on failure. */
  1227. Xchar   *name;
  1228. Xchar   *lib;
  1229. X{
  1230. X   FILE   *f;
  1231. X   int    rv;
  1232. X   struct ar_args args;
  1233. X
  1234. X   /* Open the lib file and perform the scan of the members, looking
  1235. X    * for our particular member.  If cacheing is enabled it will be
  1236. X    * taken care of automatically during the scan. */
  1237. X
  1238. X   args.lib    = lib;
  1239. X   args.member = name;
  1240. X   args.time   = (time_t)0L;
  1241. X
  1242. X   if( (f = fopen(lib, "r+")) == NIL(FILE) ) return( (time_t)1L );
  1243. X   rv = ar_scan(f, touch_function, &args );
  1244. X   fclose( f );
  1245. X
  1246. X   if( rv < 0 ) Fatal("(%s): Invalid library format", lib);
  1247. X
  1248. X   return( 0 );
  1249. X}
  1250. X
  1251. X
  1252. X
  1253. Xstatic int
  1254. Xtime_function(f, arp, argp)/*
  1255. X=============================
  1256. X   get library member's time, if it matches than return it in argp, if
  1257. X   cacheing is enabled than cache the library members also. */
  1258. XFILE           *f;      /* library file          */
  1259. Xstruct AR      *arp;    /* library member header */
  1260. Xstruct ar_args *argp;
  1261. X{
  1262. X   int rv = _cache_member( arp->ar_name, argp->lib, arp->ar_time );
  1263. X
  1264. X   if( strcmp(argp->member, arp->ar_name) == 0 ) {
  1265. X      argp->time = arp->ar_time;
  1266. X
  1267. X      if( arp->ar_time == 0 && !(Glob_attr & A_SILENT) )
  1268. X         Warning( "(%s): Can't extract library member timestamp; using EPOCH",
  1269. X              argp->member);
  1270. X
  1271. X      return( rv );  /* 1 => no cacheing, 0 => cacheing */
  1272. X   }
  1273. X
  1274. X   return( FALSE ); /* continue scan */
  1275. X}
  1276. X
  1277. X
  1278. X
  1279. Xstatic int
  1280. Xtouch_function(f, arp, argp)/*
  1281. X==============================
  1282. X   Update library member's time stamp, and write new time value into cache
  1283. X   if required. */
  1284. XFILE           *f;      /* library file */
  1285. Xstruct AR      *arp;    /* library member header */
  1286. Xstruct ar_args *argp;
  1287. X{
  1288. X   extern time_t time ANSI(( time_t * ));
  1289. X   time_t now = time((time_t*) NULL);  /* Current time.          */
  1290. X
  1291. X   if( strcmp(argp->member, arp->ar_name) == 0 ) {
  1292. X      _check_cache( argp->member, argp->lib, &now, TRUE );
  1293. X      ar_touch(f, now );
  1294. X
  1295. X      return( TRUE );
  1296. X   }
  1297. X
  1298. X   return( FALSE ); /* continue scan */
  1299. X}
  1300. X
  1301. X
  1302. X
  1303. X
  1304. Xstatic int
  1305. Xar_scan(f, function, arg)/*
  1306. X===========================
  1307. X   Scan the opened archive, and call the given function for each member found.
  1308. X   The function will be called with the file positioned at the beginning of
  1309. X   the member and it can read up to arp->ar_size bytes of the archive member.
  1310. X   If the function returns 1, we stop and return 1.  We return 0 at the end
  1311. X   of the archive, or -1 if the archive has invalid format.  This interface
  1312. X   is more general than required by "make", but it can be used by other
  1313. X   utilities.  */
  1314. Xregister FILE *f;
  1315. Xint      (*function) ANSI((FILE *, struct AR *, struct ar_args *));
  1316. Xstruct ar_args *arg;
  1317. X{
  1318. X   extern long atol ANSI((char *));
  1319. X   register char *p;
  1320. X   struct ar_hdr arhdr;   /* external archive header */
  1321. X   off_t         offset;  /* member seek offset      */
  1322. X
  1323. X#if ASCARCH
  1324. X   char magic[SARMAG];
  1325. X#else
  1326. X   unsigned short word;
  1327. X#endif
  1328. X
  1329. X   fseek( f, 0L, 0 );    /* Start at the beginning of the archive file */
  1330. X
  1331. X#if ASCARCH
  1332. X   fread( magic, sizeof(magic), 1, f );
  1333. X   if( strncmp(magic, ARMAG, SARMAG) != 0 ) return( -1 );
  1334. X#else
  1335. SHAR_EOF
  1336. echo "End of part 3"
  1337. echo "File unix/arlib.c is continued in part 4"
  1338. echo "4" > s2_seq_.tmp
  1339. exit 0
  1340.  
  1341.